home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio / Ham Radio CD-ROM (Emerald Software) (1995).ISO / misc / utilitys / filter.bas (.txt) < prev    next >
Encoding:
GW-BASIC  |  1980-01-01  |  9.8 KB  |  192 lines

  1. 1  REM FILTER PROGRAM V3.1 5/16/83
  2. 2  PRINT,"modern filter design program":PRINT
  3. 5  PRINT,"k2uyh ----- modified for ibm pc --- wa2tif":PRINT
  4. 10  REM PRECISION 5:PRINT:PRINT:PRINT "MODERN FILTER DESIGN PROGRAM":DIM TP(20),C(20),L(20),CP(11,20),LP(11,20),M(20),K(20),E(9),B(10,5),T(7,5,5)
  5. 20  PRINT: INPUT "LOW PASS (L), HIGH PASS (H), BAND PASS (B)"; Q$
  6. 25  PI=3.1416
  7. 30  INPUT "FREQUENCY IN HZ, KHZ OR MHZ"; A$: KF=1: P2=PI*2
  8. 40  IF A$="KHZ" THEN KF=1000 ELSE IF A$="MHZ" THEN KF=1E+06
  9. 50  INPUT"IMPEDANCE LEVEL = ";Z0
  10. 60  IF Q$="L" OR Q$="H" THEN 70 ELSE IF Q$="B" THEN 130 ELSE 20
  11. 70  PRINT: INPUT "CUT OFF FREQ "; FC: FC=FC*KF
  12. 80  INPUT "STOP BAND FREQ"; FS: FS=FS*KF
  13. 90  INPUT "STOP BAND ATTENUATION IN DB"; AS
  14. 100  IF Q$="L" THEN NS=FS/FC ELSE NS=FC/FS
  15. 110  PRINT "NORMALIZED CUT OFF FREQ"; NS: GOTO 200
  16. 120  REM BANDPASS FILTER
  17. 130  PRINT: INPUT "CENTER FREQUENCY ="; F0: F0=F0*KF: W0=P2*F0
  18. 140  INPUT "BANDPASS WIDTH ="; FP: FP=FP*KF: WP=P2*FP
  19. 150  QL=F0/FP: INPUT "START OF STOP BAND ="; FS: FS=FS*KF
  20. 160  INPUT "STOP BAND ATTENUATION IN DB"; AS
  21. 170  FD=F0^2/FS: NS=ABS(FS-FD)/FP
  22. 180  PRINT: PRINT "QL ="; QL, "NORM FREQ RATIO ="; NS
  23. 190  REM CALC OF # OF POLES
  24. 200  PRINT: INPUT "BUTTERWORTH (B) OR TCHEBYCHEFF (T)"; B$: N=0
  25. 210  IF B$="T" THEN 230 ELSE IF B$<>"B" THEN 200
  26. 220  N=N+1: AT=10*LOG(1+NS^(2*N))/LOG(10): IF AT>AS THEN 260 ELSE 220
  27. 230  INPUT "RIPPLE IN DB"; RP : TP(0)=1: TP(1)=NS: RE=10^(RP/10)-1
  28. 240  N=N+1:P=N:IF N>19 THEN GOTO 340 ELSE  TP(N+1)=2*NS*TP(N)-TP(N-1)
  29. 250  AT=10*LOG(1+RE*TP(N+1)^2)/LOG(10): IF AT>AS THEN 260 ELSE 240
  30. 260  PRINT "NUMBER OF SECTION REQUIRED"; N: P=N
  31. 270  REM LOAD BUTTERWORTH DATA
  32. 280  FOR N=1 TO 10: Q=(-1)^N: IF Q<0 THEN AB=INT(N/2)+1 ELSE AB=N/2
  33. 290  FOR I=1 TO AB: READ B(N,I): NEXT: NEXT
  34. 300  REM LOAD TCHEBYCHEFF DATA
  35. 310  FOR R=1 TO 7: FOR N=1 TO 5: FOR I=1 TO N
  36. 320  READ T(R,N,I): NEXT: NEXT: NEXT
  37. 330  IF B$="B" THEN 480
  38. 340  Q=(-1)^P: IF P>10 THEN PRINT "LARGEST VALUE 10": GOTO 20
  39. 350  IF Q>0 THEN P=P+1: PRINT "MUST USE ODD # FOR BAL TCH: P="; P
  40. 360  IF RP <=0.01 THEN R=1: RP=0.01: GOTO 440
  41. 370  IF RP <=0.1 THEN R=2: RP=0.1: GOTO 440
  42. 380  IF RP <=0.2 THEN R=3: RP=0.2: GOTO 440
  43. 390  IF RP <=0.5 THEN R=4: RP=0.5: GOTO 440
  44. 400  IF RP <=1 THEN R=5: RP=1: GOTO 440
  45. 410  IF RP <=2 THEN R=6: RP=2: GOTO 440
  46. 420  IF RP <=3 THEN R=7: RP=3: GOTO 440
  47. 430  PRINT "RIPPLE EXCEEDS MAXIMUN LIMIT": GOTO 20
  48. 440  PRINT: PRINT "# POLES"; "="; P, "RIPPLE"; "="; RP: PRINT
  49. 450  N=(P+1)/2: FOR J=1 TO P: IF J<=N THEN I=J ELSE I=P+1-J
  50. 460  E(J)=T(R,N,I):NEXT:GOTO 520
  51. 470  REM BUTTERWORTH CALC
  52. 480  IF P>10 THEN PRINT "LARGEST VALUE 10": GOTO 20
  53. 490  Q=(-1)^P: IF Q<0 THEN AB=INT(P/2)+1 ELSE AB=P/2
  54. 500  FOR J=1 TO P: IF J<=AB THEN I=J ELSE I=P+1-J
  55. 510  E(J)=B(P,I):NEXT
  56. 520  IF Q$="H" THEN FOR I=1 TO P:E(I)= 1/E(I):NEXT
  57. 530  N=P:GOTO 730
  58. 540  DATA 2,1.414,1,2,.765,1.848,.618,1.618,2,.518,1.414,1.932
  59. 550  DATA .445,1.247,1.802,2,.390,1.111,1.663,1.962,.347,1
  60. 560  DATA 1.532,1.879,2,.313,.908,1.414,1.782,1.975
  61. 570  REM DATA FOR TCHEBYCHEFF
  62. 580  DATA .096,.6291,.9702,.7563,1.3049,1.5773,.7969,1.394
  63. 590  DATA 1.7481,1.6331,.8144,1.427,1.8043,1.7125,1.9057
  64. 600  DATA .3052,1.0315,1.1474,1.1468,1.3712,1.9750,1.1811
  65. 610  DATA 1.4228,2.0966,1.5733,1.1956,1.4425,2.1345,1.6167
  66. 620  DATA 2.2053,.4342,1.2275,1.1525,1.3394,1.3370,2.1660
  67. 630  DATA 1.3722,1.3781,2.2756,1.5001,1.386,1.3938,2.3093
  68. 640  DATA 1.5340,2.3728,.6986,1.5963,1.0967,1.7058,1.2296
  69. 650  DATA 2.5408,1.7372,1.2583,2.6381,1.3444,1.7504,1.2690
  70. 660  DATA 2.6678,1.3673,2.7239,1.0177,2.0236,.9941,2.1349
  71. 670  DATA 1.0911,3.0009,2.1664,1.1116,3.0934,1.1736,2.1797
  72. 680  DATA 1.1192,3.1215,1.1897,3.1747,1.5296,2.7107,.8327
  73. 690  DATA 2.8310,.8985,3.7827,2.8655,.9119,3.8780,.9535,2.8790
  74. 700  DATA .9171,3.9056,.9643,3.9598,1.9953,3.3487,.7117,3.4817
  75. 710  DATA .7618,4.5381,3.5182,.7723,4.6386,.8039,3.5340,.7760
  76. 720  DATA 4.6692,.8118,4.7272
  77. 730  IF Q$="H" THEN 790 ELSE IF Q$="B" THEN 840
  78. 740  PRINT "LOW PASS (CPLS)"
  79. 750  FOR I=1 TO N STEP 2:J=I+1:C(I)=E(I)/(P2*FC*Z0):PRINT"C";I;"= ";C(I):IF J<=N THEN L(J)=E(J)*Z0/(P2*FC):PRINT"L";J;"= ";L(J):NEXT
  80. 760  PRINT "LOW PASS (LSCP)"
  81. 770  FOR I=1 TO N STEP 2:J=I+1:L(I)=E(I)*Z0/(P2*FC):PRINT"L";I;"= ";L(I):IF J<=N THEN C(J)=E(J)/(P2*FC*Z0):PRINT"C";J;"= ";C(J):NEXT:GOTO 830
  82. 780  GOTO 830
  83. 790  PRINT "HIGH PASS (LPCS)"
  84. 800  FOR I=1 TO N STEP 2:J=I+1:L(I)=E(I)*Z0/(P2*FC):PRINT"L";I;"= ";L(I):IF J<=N THEN C(J)=E(J)/(P2*FC*Z0):PRINT"C";J;"= ";C(J):NEXT
  85. 810  PRINT "HIGH PASS (CSLP)"
  86. 820  FOR I=1 TO N STEP 2:J=I+1:C(I)=E(I)/(P2*FC*Z0):PRINT "C";I;"= ";C(I):IF J<=N THEN L(J)=E(J)*Z0/(P2*FC):PRINT "L";J;"= ";L(J):NEXT
  87. 830  INPUT"WANT TO CALCULATE ANOTHER FILTER Y OR N ";Y$:IF Y$="Y" THEN 20 ELSE GOTO 1870
  88. 840  PRINT: FOR I=1 TO N
  89. 850  IF ((-1)^I)<0 THEN C(I)=E(I):CP(1,I)=C(I)/(Z0*FP*P2):LP(1,I)=1/(W0^2*CP(1,I)):GOTO 870
  90. 860  L(I)=E(I):LP(1,I)=Z0*L(I)/WP:CP(1,I)=1/(W0^2*LP(1,I))
  91. 870  NEXT
  92. 880  PRINT: PRINT "ELEMENTS PROTOTYPE #1 (CPLP/CSLS/CPLP)": PRINT: FOR I=1 TO N
  93. 890  PRINT "C"; I; "="; CP(1,I), "L"; I; "="; LP(1,I): NEXT
  94. 900  REM CALC MUTUAL INDUCTANCE
  95. 910  IF L(1)=0 THEN L(1)=C(1): FOR I=1 TO N-1
  96. 920  IF C(I)=0 THEN C(I)=L(I): L(I+1)=C(I+1)
  97. 930  M(I)=(L(1)/W0)*SQR(1/(C(I)*L(I+1))): NEXT
  98. 940  PRINT: INPUT "PROTOTYPE # (2-11) ="; P$
  99. 950  IF P$="2" THEN 1010
  100. 960  IF P$="3" THEN 1080
  101. 970  IF P$="4" THEN 1430
  102. 980  IF P$="5" THEN 1670
  103. 990  IF P$="7" THEN 1320
  104. 1000  IF P$="NEW" THEN 20 ELSE IF P$="END" THEN END ELSE PRINT "DON'T UNDERSTAND ?":GOTO 940
  105. 1010  PRINT: PRINT "ELEMENT VALUES FOR PROTOTYPE #2 (CSLS/CPLP/CSLS)"
  106. 1020  PRINT: FOR I=1 TO N
  107. 1030  IF ((-1)^I)<0 THEN CP(2,I)=1/(W0*QL*Z0*C(I)): LP(2,I)=Z0*C(I)/WP: PRINT "C"; I; "="; CP(2,I), "L"; I; "="; LP(2,I): GOTO 1050
  108. 1040  CP(2,I)=L(I)/(Z0*WP): LP(2,I)=Z0/(W0*QL*L(I)): PRINT "C"; I; "="; CP(2,I), "L"; I; "="; LP(2,I)
  109. 1050  NEXT
  110. 1060  PRINT: INPUT "WANT TO TRY ANOTHER PROTOTYPE (YES, CHANGE, NEW OR END)"; Q$: PRINT
  111. 1070  IF Q$="YES" THEN 940 ELSE IF Q$="CHANGE" THEN 1810 ELSE IF Q$="NEW" THEN 20 ELSE IF Q$="END" THEN END ELSE GOTO 1060
  112. 1080  PRINT: PRINT "ELEMENT VALUES FOR PROTOTYPE #3 (CSTCP/TCS/TCP)"
  113. 1090  PRINT: IF N<3 THEN PRINT "TOO SMALL": GOTO 940
  114. 1100  CP(3,1)=1/(W0*QL*Z0*C(1)): PRINT "C 1 ="; CP(3,1)
  115. 1110  LP(3,2)=2*Z0/(W0*QL*L(2)): LP(3,1)=Z0*C(1)/WP+LP(3,2): K(1)=SQR(LP(3,2)/LP(3,1)): CP(3,2)=L(2)/(Z0*WP)
  116. 1120  PRINT "T 1 : L 1 ="; LP(3,1), "L 2 ="; LP(3,2)
  117. 1130  PRINT SPC(6); "K 1 ="; K(1), "C 2 ="; CP(3,2)
  118. 1140  IF N=3 THEN GOTO 1230
  119. 1150  FOR I=3 TO N-1: IF ((-1)^I)<0 THEN GOTO 1190
  120. 1160  LP(3,I)=2*Z0/(W0*QL*L(I)): LP(3,I-1)=Z0*C(I-1)/(2*WP)+LP(3,I): K(I-1)=SQR(LP(3,I)/LP(3,I-1)): CP(3,I)=L(I)/(Z0*WP)
  121. 1170  PRINT "T"; I-1; ": L"; I-1; "="; LP(3,I-1), "L"; I; "="; LP(3,I)
  122. 1180  PRINT SPC(6); "K"; I-1; "="; K(I-1), "C"; I; "="; CP(3,I): GOTO 1220
  123. 1190  LP(3,I)=Z0*C(I)/(2*WP)+LP(3,I-1): CP(3,I)=1/(W0*QL*Z0*C(I)): K(I-1)=SQR(LP(3,I-1)/LP(3,I))
  124. 1200  PRINT "T"; I-1; ": L"; I-1; "="; LP(3,I-1), "L"; I; "="; LP(3,I)
  125. 1210  PRINT SPC(6); "K"; I-1; "="; K(I-1), "C"; I; "="; CP(3,I)
  126. 1220  NEXT
  127. 1230  IF ((-1)^N)<0 THEN GOTO 1270
  128. 1240  LP(3,N)=Z0/(W0*QL*L(N)): LP(3,N-1)=Z0*C(N-1)/(2*WP)+LP(3,N): K(N-1)=SQR(LP(3,N)/LP(3,N-1)): CP(3,N)=L(N)/(Z0*WP)
  129. 1250  PRINT "T"; N-1; ": L"; N-1; "="; LP(3,N-1), "L"; N; "="; LP(3,N)
  130. 1260  PRINT SPC(6); "K"; N-1; "="; K(N-1), "C"; N; "="; CP(3,N): GOTO 1300
  131. 1270  LP(3,N)=Z0*C(N)/WP+LP(3,N-1): CP(3,N)=1/(W0*QL*Z0*C(N)): K(N-1)=SQR(LP(3,N-1)/LP(3,N))
  132. 1280  PRINT "T"; N-1; ": L"; N-1; "="; LP(3,N-1), "L"; N; "="; LP(3,N)
  133. 1290  PRINT SPC(6); "K"; N-1; "="; K(N-1), "C"; N; "="; CP(3,N)
  134. 1300  PRINT: INPUT "WANT TO TRY ANOTHER PROTOTYPE (YES, CHANGE, NEW OR END)"; Q$: PRINT
  135. 1310  IF Q$="YES" THEN 940 ELSE IF Q$="CHANGE" THEN 1810 ELSE IF Q$="NEW" THEN 1080 ELSE IF Q$="END" THEN END ELSE GOTO 1300
  136. 1320  PRINT: PRINT "ELEMENT VALUES FOR PROTOTYPE #7 (CPLP/CS/CPLP)"
  137. 1330  CP(7,1)=L(1)/(Z0*WP)-M(1)/Z0: LP(7,1)=Z0/(W0*QL*L(1))
  138. 1340  PRINT: PRINT "C 1 ="; CP(7,1), "L 1 ="; LP(7,1): IF N<3 THEN 1380
  139. 1350  FOR I=2 TO 2*N-4 STEP 2: CP(7,I)=M(I/2)/Z0: PRINT "C"; I; "="; CP(7,I)
  140. 1360  CP(7,I+1)=L(1)/(Z0*WP)-M(I/2)/Z0-M(I/2+1)/Z0: LP(7,I+1)=LP(7,1)
  141. 1370  PRINT "C"; I+1; "="; CP(7,I+1), "L"; I+1; "="; LP(7,I+1): NEXT
  142. 1380  CP(7,2*N-2)=M(N-1)/Z0: CP(7,2*N-1)=L(1)/(Z0*WP)-M(N-1)/Z0: LP(7,2*N-1)=LP(7,1)
  143. 1390  PRINT "C"; 2*N-2; "="; CP(7,2*N-2)
  144. 1400  PRINT "C"; 2*N-1; "="; CP(7,2*N-1), "L"; 2*N-1; "="; LP(7,2*N-1)
  145. 1410  PRINT: INPUT "WANT TO TRY ANOTHER PROTOTYPE (YES, CHANGE, NEW OR END)"; Q$: PRINT
  146. 1420  IF Q$="YES" THEN 940 ELSE IF Q$="CHANGE" THEN 1810 ELSE IF Q$="NEW" THEN 1080 ELSE IF Q$="END" THEN END ELSE GOTO 1410
  147. 1430  PRINT: PRINT "ELEMENT VALUES FOR PROTOTYPE #4 (CPTCS/TCP/TCS)"
  148. 1440  PRINT: IF N<3 THEN PRINT "TOO SMALL": GOTO 940
  149. 1450  CP(4,1)=C(1)/(Z0*WP): PRINT "C 1 ="; CP(4,1)
  150. 1460  LP(4,1)=Z0/(W0*QL*C(1)): LP(4,2)=Z0*L(2)/(2*WP)+LP(4,1): K(1)=SQR(LP(4,1)/LP(4,2)): CP(4,2)=1/(W0*QL*Z0*L(2))
  151. 1470  PRINT "T 1 : L 1 ="; LP(4,1), "L 2 ="; LP(4,2)
  152. 1480  PRINT SPC(6); "K 1 ="; K(1), "C 2 ="; CP(4,2)
  153. 1490  IF N=3 THEN GOTO 1580
  154. 1500  FOR I=3 TO N-1: IF ((-1)^I)>0 THEN GOTO 1540
  155. 1510  LP(4,I)=2*Z0/(W0*QL*C(I)): LP(4,I-1)=Z0*L(I-1)/(2*WP)+LP(4,I): K(I-1)=SQR(LP(4,I-1)/LP(4,I)): CP(4,I)=C(I)/(Z0*WP)
  156. 1520  PRINT "T"; I-1; ": L"; I-1; "="; LP(4,I-1), "L"; I; "="; LP(4,I)
  157. 1530  PRINT SPC(6); "K"; I-1; "="; K(I-1), "C"; I; "="; CP(4,I): GOTO 1570
  158. 1540  LP(4,I)=Z0*L(I)/(2*WP)+LP(4,I-1): CP(4,I)=1/(W0*QL*Z0*L(I)): K(I-1)=SQR(LP(4,I)/LP(4,I-1))
  159. 1550  PRINT "T"; I-1; ": L"; I-1; "="; LP(4,I-1), "L"; I; "="; LP(4,I)
  160. 1560  PRINT SPC(6); "K"; I-1; "="; K(I-1), "C"; I; "="; CP(4,I)
  161. 1570  NEXT
  162. 1580  IF ((-1)^N)>0 THEN GOTO 1620
  163. 1590  LP(4,N)=Z0/(W0*QL*C(N)): LP(4,N-1)=Z0*L(N-1)/(2*WP)+LP(4,N): K(N-1)=SQR(LP(4,N)/LP(4,N-1)): CP(4,N)=C(N)/(Z0*WP)
  164. 1600  PRINT "T"; N-1; ": L"; N-1; "="; LP(4,N-1), "L"; N; "="; LP(4,N)
  165. 1610  PRINT SPC(6); "K"; N-1; "="; K(N-1), "C"; N; "="; CP(4,N): GOTO 1650
  166. 1620  LP(4,N)=Z0*L(N)/WP+LP(4,N-1)/2: CP(4,N)=1/(W0*QL*Z0*L(N)): K(N-1)=SQR(LP(4,N-1)/LP(4,N))
  167. 1630  PRINT "T"; N-1; ": L"; N-1; "="; LP(4,N-1), "L"; N; "="; LP(4,N)
  168. 1640  PRINT SPC(6); "K"; N-1; "="; K(N-1), "C"; N; "="; CP(4,N)
  169. 1650  PRINT: INPUT "WANT TO TRY ANOTHER PROTOTYPE (YES, CHANGE, NEW OR END)"; Q$: PRINT
  170. 1660  IF Q$="YES" THEN 940 ELSE IF Q$="CHANGE" THEN 1810 ELSE IF Q$="NEW" THEN 1080 ELSE IF Q$="END" THEN END ELSE GOTO 1300
  171. 1670  PRINT: PRINT "ELEMENT VALUES FOR PROTOTYPE #5 (CST/CST/CST)"
  172. 1680  PRINT: IF N<2 THEN PRINT "TOO SMALL": GOTO 940
  173. 1690  CP(5,1)=1/(W0*QL*Z0*L(1)): LP(5,1)=Z0*L(1)/WP
  174. 1700  CP(5,N)=CP(5,1): LP(5,N)=LP(5,1)
  175. 1710  PRINT "C 1 ="; CP(5,1)
  176. 1720  IF N=2 THEN GOTO 1760 ELSE LI=Z0*L(1)/(2*WP): FOR I=2 TO N-1: LP(5,I)=LI
  177. 1730  IF ((-1)^I)<0 THEN M(I-1)=L(1)*SQR(1/(C(I-1)*L(I)))/W0 ELSE M(I-1)=L(1)*SQR(1/(L(I-1)*C(I)))/W0
  178. 1740  PRINT "T"; I-1; ":", "L"; I-1; "="; LP(5,I-1), "L"; I; "="; LP(5,I)
  179. 1750  PRINT "M"; I-1; "="; M(I-1): NEXT
  180. 1760  IF ((-1)^I)<0 THEN M(N-1)=L(1)*SQR(1/(C(N-1)*L(N)))/W0 ELSE M(N-1)=L(1)*SQR(1/(L(N-1)*C(N)))/W0
  181. 1770  PRINT "T"; N-1; ":", "L"; N-1; "="; LP(5,N-1), "L"; N; "="; LP(5,N)
  182. 1780  PRINT "M"; N-1; "="; M(N-1): PRINT "C"; N; "="; CP(5,N)
  183. 1790  PRINT: INPUT "WANT TO TRY ANOTHER PROTOTYPE (YES, CHANGE, NEW OR END)"; Q$: PRINT
  184. 1800  IF Q$="YES" THEN 940 ELSE IF Q$="CHANGE" THEN 1810 ELSE IF Q$="NEW" THEN 1080 ELSE IF Q$="END" THEN END ELSE GOTO 1800
  185. 1810  INPUT "WANT TO CHANGE Z0 (Y/N)"; Q$: IF Q$="Y" THEN INPUT "IMPEDANCE LEVEL ="; Z0
  186. 1820  INPUT "WANT TO CHANGE BANDPASS"; Q$: IF Q$="Y" THEN INPUT "BANDPASS WIDTH ="; FP: FP=FP*KF: WP=P2*FP
  187. 1830  PRINT: FOR I=1 TO N
  188. 1840  IF ((-1)^I)<0 THEN CP(1,I)=C(I)/(Z0*FP*P2): LP(1,I)=1/(W0^2*CP(1,I)): GOTO 1860 
  189. 1850  LP(1,I)=Z0*L(I)/WP: CP(1,I)=1/(W0^2*LP(1,I))
  190. 1860  NEXT: GOTO 940
  191. 1870  END
  192.